package net.freestu.sola.web.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**这是个工具类。主要是用来创建文件和目录。相当于全局函数*/
public class FileManager {

	private static final ArrayList FILELIST = new ArrayList();//这里的final表示这个引用不能改变，但并不表示里面装的东西不能改变 	

	/**在指定文件目录下创建文件
	 */
	public static boolean buildFile(String path, String filename) {//OK!

		try {

			String pf = path + File.separator + filename;

			File file = new File(pf);
			if (!file.exists()) {

				if (!file.createNewFile()) {//创建新文件。
					throw new Exception("Failure to create the file: "
							+ filename);

				} else {
					return true;
				}
			} else {

				throw new Exception("The file: " + filename + " exits");
			}
		} catch (Exception e) {
			return false;
		}

	}

	/**在指定路径创建目录*/
	public static boolean buildDir(String path, String dirname) {//OK!

		path += File.separator + dirname;//这里缺一个+号

		try {
			if (!(new File(path).isDirectory())) {

				new File(path).mkdirs();//如果没有则创建一个该路径下的文件夹。

			} else {

				return false;
			}

		} catch (SecurityException e)//注意抛出的异常
		{
			return false;

		}
		return true;
	}
	
	
	public static boolean buildDir(String path) {//OK!

		try {
			if (!(new File(path).isDirectory())) {

				new File(path).mkdirs();//如果没有则创建一个该路径下的文件夹。
			} else {
				return false;
			}
		} catch (SecurityException e){
			return false;
		}
		return true;
	}
	
	
	
	

	/**删除目录下的全部文件
	 */
	public static boolean deleteDirAllFiles(String path, String dirname) {//OK!

		File dir = new File(path + File.separator + dirname);

		delete(dir);

		return true;
	}

	/**
	 * 重载函数
	 * @param path
	 * @return
	 */
	public static boolean deleteDirAllFiles(String path) {//OK!

		File dir = new File(path);

		delete(dir);

		return true;

	}

	/**删除指定目下的所有文件。如果里面还有目录里面还有文件。继续删除。最后将目录删除。
	 * 但是并不把File file 删除.
	 */
	public static void delete(File file) {

		File[] files = file.listFiles();

		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile()) {
				files[i].delete();
			} else if (files[i].isDirectory()) {//这里实现了递归。如果里面还有目录。仍然删除。

				if (!files[i].delete()) {//如果目录下有文件。
					delete(files[i]);
				}
			}
		}
		deleteDirectory(file);//将没有文件的目录删除。
	}

	/**删除没有文件的目录
	 */
	private static void deleteDirectory(File file) {

		File[] filed = file.listFiles();
		for (int i = 0; i < filed.length; i++) {
			deleteDirectory(filed[i]);//递归。
			filed[i].delete();
		}
	}

	/**
	 * 删除文件夹以及里面的文件。
	 * @param path
	 * @param dirname
	 */
	public static void deleteDir(String path, String dirname) {

		deleteDirAllFiles(path, dirname);
		File df = new File(path + File.separator + dirname);
		df.delete();
	}

	/**
	 * 获取一个文件夹中的所有文件。这个方法有个顺序问题？？并不是按照文件名来规定的
	 * @param folder 文件夹中
	 * @param prefix 符合前缀的提取出来。
	 * @return String 是文件路径
	 */
	public static List getFiles(String folder, String prefix) {

		refreshFileList(folder, prefix);
		ArrayList re = new ArrayList(FILELIST);//这个地方必须重新农new个对象。否则，两个引用全指向一个地方了。

		FILELIST.clear();
		return re;
	}

	private static void refreshFileList(String strPath, String prefix) {
		File dir = new File(strPath);
		File[] files = dir.listFiles();

		if (files == null)
			return;
		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {
				refreshFileList(files[i].getAbsolutePath(), prefix);
			} else {

				if (files[i].getName().startsWith(prefix)) {
					FILELIST.add(files[i].getAbsolutePath());
				}
			}
		}
	}

	/**   
	 * 删除单个文件   
	 * @param   fileName    被删除文件的文件名   
	 * @return 单个文件删除成功返回true,否则返回false   
	 */
	public static boolean deleteFile(String fileName) {
		File file = new File(fileName);
		if (file.isFile() && file.exists()) {
			file.delete();
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 是上个方法的循环实现，貌似这样效率更快点。但情况比较特定。只能用于该格式的文件存储。
	 * @param folder  例：D:\工作室收藏\编程工作室\JAVA区\Java程序调试区\索引系统\www.cdut.edu.cn\www.cdut.edu.cn
	 * @return 返回该文件夹所有的P开头的文件。
	 */
	public static List getPageFiles(String folder) {

		ArrayList al = new ArrayList();
		File f1 = new File(folder + File.separator + "PageDB" + File.separator
				+ "P1");
		al.add(f1.getAbsolutePath());
		int l = 1;//
		File f = new File(folder + File.separator + "PageDB");

		int level = (f.listFiles().length) - 1;//表示爬行了多少层.

		while (l <= level) {

			File dir = new File(folder + File.separator + "PageDB"
					+ File.separator + "PageDB" + l);
			if (!dir.exists()) {
				break;
			}
			File[] files = dir.listFiles();
			for (int i = 0; i < files.length; i++) {

				al.add(files[i].getAbsolutePath());
			}
			l++;
		}
		return al;
	}

	/**
	 * 在指定的路径下面创建xml文件，并且写入<page-infos></page-infos>标签。
	 * @param path
	 * @param name
	 */
	public static void buildPageXml(String path, String filename) {

		//filename+=".xml";应该在调用时将其输入进去。

		buildFile(path, filename);

		String line = "<?xml version=\"1.0\" encoding=\"gbk\" ?>\n"
				+ "<page-infos></page-infos>";

		try {
			FileWriter fw = new FileWriter(path + File.separator + filename);
			BufferedWriter bw = new BufferedWriter(fw);
			bw.write(line);
			bw.newLine();
			bw.flush();
			bw.close();
			fw.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 将在dir文件夹下面的oldname名字改为newname.
	 * @param dir
	 * @param oldname
	 * @param newname
	 */
	public static void modifyFileName(File dir, String oldname, String newname) {

		File o = new File(dir + File.separator + oldname);
		File n = new File(dir + File.separator + newname);
		o.renameTo(n);
	}

	/*
	 public static void main(String[] args){
	 
	 ArrayList al=(ArrayList)FileManager.getPageFiles
	 ("D://工作室收藏//编程工作室//JAVA区//Java程序调试区//索引系统//www.cdut.edu.cn//cdut.edu.cn");
	 
	 Iterator it=al.iterator();
	 
	 
	 while(it.hasNext()){
	 System.out.println("在这里："+it.next());
	 
	 }
	 
	 }*/

	public static void main(String[] args) {

		FileManager.modifyFileName(new File("c:\\"), "NewLink2MD5",
				"OldLink2MD5");
	}

	/**
	 public static void main(String[] args){
	 
	 
	 MyLogger.log("8");
	 
	 String path="e:";
	 String name="Love";
	 FileManager.buildDir(path,name);
	 FileManager.buildFile("d:"+File.separator+"Love","love.txt");
	 
	 FileManager.deleteDirAllFiles("d:","Love");
	 
	 
	 }
	 */

	/*
	 public static void main(String[] args){
	 
	 FileManager.buildDir(".","alone");
	 
	 
	 }*/

}
